import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Description： TODO
 * Author： 王多鱼
 * CreateTime： 2021/6/10 20:32
 **/
class MyData{
    volatile  int number = 0;

    public void addT060(){
        this.number = 60;
    }
    //请注意，此时number前面是加了volatile关键字修饰的，volatile不保证原子性
    public void addPlusPlus(){
        number++;
    }

    AtomicInteger atomicInteger = new AtomicInteger();
    public void addAtomic(){
        atomicInteger.getAndIncrement();//+1
    }
}
public class VolatileDemo {
    public static void main(String[] args) {
        MyData myData = new MyData();
//               new Thread(() -> {
//            System.out.println(Thread.currentThread().getName() + "\t come in ");
//            //暂停一会线程
//            try {
//                TimeUnit.SECONDS.sleep(3);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            myData.addT060();
//            System.out.println(Thread.currentThread().getName() + "\t update number value: " + myData.number);
//        }, "AAA").start();
//        //第二个线程就是main线程
//        while (myData.number == 0) {
//            //main线程就一直在这循环 知道number不等于0
//        }
//        System.out.println(Thread.currentThread().getName() + "\t mission is over,main get number value: " + myData.number);


        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                for (int j=1;j<=1000;j++){
//                    myData.addPlusPlus();
                    myData.addAtomic();
                }
            },String.valueOf(i)).start();
        }
        //需要等待上面20个线程全都计算完成后，再用main线程取得最终的结果值看是多少
        while (Thread.activeCount() >2){
            //2  是指最少有两个线程 main线程和GC线程
            Thread.yield();
        }
//        System.out.println(Thread.currentThread().getName()+"\t finally number value: "+myData.number);
        System.out.println(Thread.currentThread().getName()+"\t finally number value: "+myData.atomicInteger);


    }
}